package demo4

import "io"

/*
	接口的嵌套组合
	1. 在 Go语言中，不仅结构体与结构体之间可以嵌套，接口与接口间也可以通过嵌套创造出新的接口。
	2. 一个接口可以包含一个或多个其他的接口，这相当于直接将这些内嵌接口的方法列举在外层接口中一样。
		只要接口的所有方法被实现，则这个接口中的所有嵌套接口的方法均可以被调用。
*/

/*
	demo1: 系统包中的接口嵌套组合
	1. Go语言的 io 包中定义了写入器（Writer）、关闭器（Closer）和写入关闭器（WriteCloser）3个接口
*/

/* demo11 */
type writer11 interface {
	write(p []byte) (n int, err error)
}

type closer11 interface {
	close() error
}

type writerCloser11 interface {
	writer11
	closer11
}

// 在代码中使用 io.Writer、io.Closer 和 io.WriteCloser 这 3 个接口时，
//	只需要按照接口实现的规则实现 io.Writer 接口和 io.Closer 接口即可

/* demo12 */
// 声明结构体
type device struct{}

// 实现 io.Write 方法
func (d *device) Write(p []byte) (n int, err error) {
	return 0, nil
}

// 实现 io.Closer 的 Close() 方法
func (d *device) Close() error {
	return nil
}

// TestDemo48 接口的嵌套组合
func TestDemo48() {
	/* demo12 */
	// 声明 WriteCloser, 并赋予 device 实例
	var wc io.WriteCloser = new(device)

	// 写入数据
	wc.Write(nil)

	// 关闭设备
	wc.Close()

	// 声明写入器, 并赋予 device 的新实例
	var writeOnly io.Writer = new(device)

	// 写入数据
	writeOnly.Write(nil)
}
